home *** CD-ROM | disk | FTP | other *** search
/ Apple II Magazines (DO) / Softdisk Magazette Volume 1, No. 07 (1982-03)(Softdisk)(Side A).zip / Softdisk Magazette Volume 1, No. 07 (1982-03)(Softdisk)(Side A).do / SNOWFLAKE.bas < prev    next >
BASIC Source File  |  1996-12-24  |  6KB  |  113 lines

  1. 0  REM  BY J.S.GARRISON III 1980, ADAPTED FROM ALGOL
  2. 10  DIM X(30),Y(30),S(10),X0S(10),XKS(10),X1S(10),Y0S(10),YKS(10),Y1S(10),IS(10),SS(10)
  3. 20  TEXT : HOME :SZ = 60:XI = 140:YI = 80:DP = 3:N = 6:GO = 0: GOSUB 1000: VTAB 22: PRINT "     S  N  O  W  F  L  A  K  E": FOR I = 1 TO 2000: NEXT I
  4. 30  VTAB 22: PRINT "NEAT, WHAT ?...THIS PROGRAM ALLOWS YOU ": PRINT "TO DO MUCH MORE-YOU SELECT THE": PRINT "PARAMETERS; I'LL DRAW DIFFERENT ONES.."
  5. 35  FOR I = 1 TO 3000: NEXT I
  6. 40  GOSUB 4000: TEXT : HOME : PRINT "SOME OF THESE FIGURES ARE QUITE COMPLEX": PRINT : PRINT "AND TAKE CONSIDERABLE TIME TO PLOT. THE": PRINT : PRINT "ORIGINAL SNOWFLAKE CURVE (DUE TO HELGE"
  7. 50  PRINT : PRINT "VAN KOCH) IS EVERYWHERE CONTINUOUS BUT": PRINT : PRINT "NOWHERE DIFFERENTIABLE;IT IS INFINITELY": PRINT : PRINT "LONG BUT BOUNDS A FINITE AREA."
  8. 60  PRINT : PRINT "   THE FIGURES ARE PLOTTED AFTER EACH": PRINT : PRINT "NEW END POINT IS COMPUTED-CONSIDERING": PRINT : PRINT "THE ANGLE THROUGH WHICH THE 'PEN' MUST"
  9. 70  PRINT : PRINT "TURN AND HOW FAR IT MUST GO BEFORE IT": PRINT : PRINT "REACHES THE NEXT TURN POINT."
  10. 80  GOSUB 4000: HOME : PRINT "ANOTHER WAY TO PUT THIS IS THAT I AM": PRINT : PRINT "LEADING A BLIND TURTLE BY TELEPHONE": PRINT : PRINT "DIRECTIONS- THE ONLY THING HE REMEMBERS"
  11. 90  PRINT : PRINT "IS WHERE HE STARTED FROM".
  12. 91  HOME : VTAB 22: PRINT "THE FIRST DECISION HAS TO DO WITH THE": PRINT "'LEVEL' OF THE CURVE.TO ILLUSTRATE..": PRINT "THIS IS A LEVEL 1 FIGURE...":SZ = 30:XI = 140:YI = 80:DP = 1:N = 8:GO = 1
  13. 92  GOSUB 1000: GOSUB 5000:DP = 2: VTAB 23: PRINT "THIS A LEVEL 2 FIGURE...": GOSUB 1000: GOSUB 5000
  14. 93 DP = 3: VTAB 23: PRINT "THIS IS A LEVEL 3 FIGURE...": GOSUB 1000: GOSUB 5000
  15. 94  HOME : VTAB 22: PRINT "GOT THAT ?..THEY GET PRETTIER THE MORE": PRINT "COMPLEX, BUT TAKE LONGER TO DRAW.": GOSUB 4000
  16. 95  TEXT : HOME : PRINT : PRINT "THE NEXT DECISION IS SIMPLE-THE NUMBER": PRINT : PRINT " OF SIDES-FOR SOME REASON, ODD NUMBERS": PRINT : PRINT "GREATER THAN 3 DON'T WORK. YOU SHOULD "
  17. 96  PRINT : PRINT "RECOGNIZE THAT THE TIME TO PLOT THE": PRINT : PRINT "FIGURES IS RELATED TO THE LEVEL OF THE": PRINT : PRINT "CURVE AND THE NUMBER OF SIDES. 5-LEVEL": PRINT : PRINT "10-SIDED FIGURE IS QUITE PRETTY,BUT"
  18. 97  PRINT : PRINT "REQUIRES 5 (FIVE) HOURS TO PLOT !!": PRINT : PRINT "IF YOU DON'T BELIEVE I'M BUSY, ADD": PRINT : PRINT "LINE 2005 PRINT XK,YK": PRINT : PRINT "ONE FINAL DECISION-GROWTH IN OR OUTWARD": VTAB 24: GOSUB 4000
  19. 98  HOME : VTAB 22: PRINT "THIS IS OUTWARD GROWTH...":DP = 2:XI = 140:YI = 80:N = 8:SZ = 30:GO = 1: GOSUB 1000: VTAB 24: GOSUB 4000
  20. 99  HOME : VTAB 22: PRINT " AND THIS IS INWARD GROWTH...";:GO = 0:SZ = 80: GOSUB 1000: PRINT "  SEE ?..": VTAB 24: GOSUB 4000
  21. 100  TEXT : HOME 
  22. 110  PRINT "MAXIMUM SIZE = 40 FOR OUTWARD GROWTH,": PRINT " 130 FOR INWARD GROWTH.";: INPUT "YOUR CHOICE ? ";SZ
  23. 120  PRINT : PRINT "X-CENTER OF THE SCREEN IS 140.": INPUT "    YOUR CHOICE (CR FOR CENTER) ? ";X$
  24. 127  IF X$ = ""  THEN XI = 140: GOTO 130
  25. 128 XI =  VAL(X$)
  26. 130  PRINT : PRINT "Y-CENTER OF THE SCREEN IS 80.": INPUT "    YOUR CHOICE (CR FOR CENTER) ? ";Y$
  27. 135  IF Y$ = ""  THEN YI = 80: GOTO 140
  28. 137 YI =  VAL(Y$)
  29. 140  PRINT : INPUT "LEVEL OF CURVE (NO MORE THAN 5 PLEASE) ? ";DP
  30. 150  PRINT : PRINT "NUMBER OF SIDES OF THE BASIC FIGURE": PRINT "    (EVEN NUMBERS WORK BEST) ";: INPUT N
  31. 160  PRINT : INPUT "GROW OUTWARD (1) OR INWARD (0) ? ";GO
  32. 162  IF GO = 1  THEN 170
  33. 164  IF GO = 0  THEN 170
  34. 166  GOTO 160
  35. 170  GOSUB 1000
  36. 180  VTAB 22: INPUT "ANOTHER ? ";Y$: IF  LEFT$(Y$,1) = "Y"  THEN  GOTO 100
  37. 190  PRINT  CHR$(4)"RUN GARRISON'S.SHOW"
  38. 1000  HGR 
  39. 1010  HCOLOR= 7
  40. 1400 PI = 3.1415927
  41. 1410 UP = 3:DOWN = 2:DM = DP -1
  42. 1420 NE = (NMOD2 = 0)
  43. 1430  IF NE  THEN 1434
  44. 1432 ND = 2 *N: GOTO 1440
  45. 1434 ND = N
  46. 1500  FOR I = 0 TO ND -1
  47. 1510 A = 2 *PI *I/ND
  48. 1520 X(I) =  COS(A):Y(I) =  SIN(A)
  49. 1530  NEXT I
  50. 1550 S(0) = 2 *SZ * SIN(PI/N)
  51. 1560  IF GO  OR N = 3  THEN 1600
  52. 1570  IF NE  THEN S(0) = S(0)/2: GOTO 1600
  53. 1580 C =  COS(PI/N)
  54. 1590 S(0) = 2 *S(0)/(C * SQR(10 +6 *C))
  55. 1595  PRINT S(0)
  56. 1600  FOR I = 1 TO DP
  57. 1610 S(I) = S(I -1)/3
  58. 1620  NEXT I
  59. 1640 LV = 0
  60. 1650 X0 = XI -S(0)/2:X1 = X0:XK = X1
  61. 1660 Y0 = YI -S(0)/(2 * TAN(PI/N)):Y1 = Y0:YK = Y1
  62. 1670 IP = UP: GOSUB 2000:IP = DOWN
  63. 1690 DI = N -2
  64. 1700 LT = 2 *N -2
  65. 1710 H1 = N -2:H2 =  -2
  66. 1720  IF   NOT GO  THEN H1 =  -H1:H2 =  -H2
  67. 1730  IF H1 <0  THEN 1733
  68. 1732 H2 = H2 +2 *N: GOTO 1740
  69. 1733 H1 = H1 +2 *N
  70. 1740  IF NE  THEN DI = DI/2:LT = LT/2:H1 = H1/2:H2 = H2/2
  71. 1760 XK = X0 +S(0) *X(DI):YK = Y0 +S(0) *Y(DI)
  72. 1770  GOSUB 3000
  73. 1790  FOR I = 2 TO N -1
  74. 1800 X0 = XK:Y0 = YK
  75. 1810 DI =  INT(((DI +LT)/ND - INT((DI +LT)/ND)) *ND +.05) * SGN((DI +LT)/ND)
  76. 1820 XK = X0 +S(0) *X(DI):YK = Y0 +S(0) *Y(DI)
  77. 1830  GOSUB 3000
  78. 1840  NEXT I
  79. 1890 DI =  INT(((DI +LT)/ND - INT((DI +LT)/ND)) *ND +.05) * SGN((DI +LT)/ND)
  80. 1900 X0 = XK:Y0 = YK:XK = X1:YK = Y1
  81. 1910  GOSUB 3000
  82. 1920  RETURN 
  83. 2000  HPLOT X0,Y0 TO XK,YK
  84. 2010  RETURN 
  85. 3000  IF LV > = DM  THEN  GOSUB 2000: RETURN 
  86. 3020 X0S(LV) = X0:XKS(LV) = XK:X1S(LV) = X1
  87. 3030 Y0S(LV) = Y0:YKS(LV) = YK:Y1S(LV) = Y1
  88. 3040 IS(LV) = I:SS(LV) = SK
  89. 3050 LV = LV +1
  90. 3058 X1 = XK:Y1 = YK
  91. 3070 SK = S(LV)
  92. 3080 XK = X0 +SK *X(DI):YK = Y0 +SK *Y(DI)
  93. 3090  GOSUB 3000
  94. 3110 X0 = XK:Y0 = YK
  95. 3120 DI =  INT(((DI +H1)/ND - INT((DI +H1)/ND)) *ND +.05) * SGN((DI +H1)/ND)
  96. 3130 XK = X0 +SK *X(DI):YK = Y0 +SK *Y(DI)
  97. 3140  GOSUB 3000
  98. 3160  FOR I = 3 TO N
  99. 3170 X0 = XK:Y0 = YK
  100. 3180 DI =  INT(((DI +H2)/ND - INT((DI +H2)/ND)) *ND +.05) * SGN((DI +H2)/ND)
  101. 3190 XK = X0 +SK *X(DI):YK = Y0 +SK *Y(DI)
  102. 3200  GOSUB 3000
  103. 3210  NEXT I
  104. 3240 DI =  INT(((DI +H1)/ND - INT((DI +H1)/ND)) *ND +.05) * SGN((DI +H1)/ND)
  105. 3250 X0 = XK:Y0 = YK:XK = X1:YK = Y1
  106. 3260  GOSUB 3000
  107. 3280 LV = LV -1
  108. 3290 X0 = X0S(LV):XK = XKS(LV):X1 = X1S(LV)
  109. 3300 Y0 = Y0S(LV):YK = YKS(LV):Y1 = Y1S(LV)
  110. 3310 I = IS(LV):SK = SS(LV)
  111. 3320  RETURN 
  112. 4000  VTAB 24: PRINT "HIT ANY KEY TO MOVE ON...";: GET A$: RETURN 
  113. 5000  FOR T = 1 TO 3000: NEXT : RETURN